struct proc;
struct context;
struct trapframe;

//io.c
void cgaputc(int c);
void setCursor();
void clearScreen();
void showWelcome();
void panic();
void panicInfo(char *s);
void printint(int xx, int base, int sign);
void consputc(int c);
void easyprint(char * s);
void consoleinit(void);
void printk(char *fmt, ...);
int kbdgetc(void);
void kbdintr(void);
void consoleintr(int (*getc)(void));

//string.c
void* memmove(void*, const void*, uint);
void* memset(void*, int, uint);
int strlen(const char *s);
void* memcpy(void *dst, const void *src, uint n);
int memcmp(const void *v1, const void *v2, uint n);
char* strncpy(char *s, const char *t, int n);
char* strncpyEnd0(char *s, const char *t, int n);

//mm.c
void kFreeVMInit(void *vstart, void *vend, int first);
void freeVMRange(void *vstart, void *vend);
void kFreePage(char *v);
void kPageTableInit(void);
int mapPages(pde_t *pgdir, void *va, uint size, uint pa, int perm);
void switchKVM(void);
void switchUVM(struct proc *p);
void initUVM(pde_t *pgdir, char *init, uint sz);
pde_t* setupKVM(void);
char* kAlloc(void);
pte_t * walkPGDir(pde_t *pgdir, const void *va, int alloc);
void seginit(void);
pde_t* copyUVM(pde_t *pgdir, uint sz);

//lapic.c
void lapicw(int index, int value);
void lapicinit(void);
int cpunum(void);
void lapiceoi(void);
void lapicstartap(uchar apicid, uint addr);

//mp.c
uchar sum(uchar *addr, int len);
struct mp* mpsearch1(uint a, int len);
struct mp* mpsearch(void);
struct mpconf* mpconfig(struct mp **pmp);
void mpinit(void);

//ioapic.c
uint ioapicread(int reg);
void ioapicwrite(int reg, uint data);
void ioapicinit(void);
void ioapicenable(int irq, int cpunum);

//lock.c
void acquire(uint *lock);
void release(uint *lock);
void pushcli(void);
void popcli(void);

//main.c
void mpenter(void);
void mpmain(void);
void startothers(void);

//proc.c
void userinit(void);
void pinit(void);
void scheduler(void);
struct proc* allocproc(void);
void forkret(void);
int fork(void);
void sched(void);
void yield(void);
void procdump(void);

// swtch.S
void swtch(struct context**, struct context*);

//trap.c
void tvinit(void);
void idtinit(void);
void trap(struct trapframe *tf);

//syscall.c
int fetchint(uint addr, int *ip);
int fetchstr(uint addr, char **pp);
int argint(int n, int *ip);
int argstr(int n, char **pp);
void syscall(void);

//sysproc.c
int sys_fork(void);
int sys_getpid(void);
int sys_print(void);

//工具
#define LENGTH(x) (sizeof(x)/sizeof((x)[0]))


